/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.tiempo.MesEnum;
import com.model.domain.tiempo.Periodo;
import com.model.domain.tiempo.ProgramacionPeriodo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import util.date.DateUtil;
import util.www.sql.SentenciaSql;
import util.www.sql.TipoSentenciaSql;
import util.www.sql.RegistroSql;


/**
 *
 * @author Rdelacruz
 */
public class ProgramacionPeriodoService 
extends AbstractService
{
    
    private ConglomeradoService conglomeradoService;
    //private ConglomeradoPersonalService conglomeradoPersonalService;
    
    public void setearFechaInicioByFechaInicioPeriodo1(Periodo periodo, String fechaInicioPeriodo1) throws SQLException {
        if(periodo!=null && periodo.getCodigo()!=null && fechaInicioPeriodo1!=null) {
            ProgramacionPeriodo pp = new ProgramacionPeriodo();
            Periodo p = new Periodo();
            p.setFechaInicio(fechaInicioPeriodo1);
            pp.setPeriodo1(p);
            try {
                setearPeriodos(pp);
            } catch (ParseException ex) {
                throw new SQLException(ex);
            }

            p = pp.getPeriodoByCodigo(periodo.getCodigo());
            periodo.setFechaInicio(p.getFechaInicio());
        }
    }
    
    private Periodo getPeriodo(Date fecha, long tiempoMilisegundos) throws ParseException {
        Date d = new Date(fecha.getTime()+tiempoMilisegundos);
        Periodo p = new Periodo();
        p.setFechaInicio(DateUtil.DateToString(d));
        return p;
    }
    
    private void setearPeriodos(ProgramacionPeriodo pp) throws ParseException {
        Date d1 = DateUtil.StringToDate(pp.getPeriodo1().getFechaInicio());        
        pp.setPeriodo2(getPeriodo(d1,DateUtil.SEMANA));
        pp.setPeriodo3(getPeriodo(d1,2*DateUtil.SEMANA));
        pp.setPeriodo4(getPeriodo(d1,3*DateUtil.SEMANA));
        pp.setPeriodo5(getPeriodo(d1,4*DateUtil.SEMANA));
    }
        
    private void setearProgramacionPeriodo(ProgramacionPeriodo obj, ResultSet rs) throws ParseException, SQLException {
        obj.setAnho(rs.getString("Año"));
        obj.setMes(rs.getString("Mes"));

        Periodo p = new Periodo();
        p.setFechaInicio(rs.getString("fecha_inicio"));
        obj.setPeriodo1(p);

        setearPeriodos(obj);       
    }
    
    public ProgramacionPeriodo findByAnhoMes(Connection con, String anho, String mes) throws SQLException, ParseException {
        
        Statement st = null;
        try {                        
            st = con.createStatement();
            String sql = "select * from Programacion_Periodo where Año='"+anho+"' and Mes='"+mes+"'";
            ResultSet rs = st.executeQuery(sql);
            if(rs.next()) {
                ProgramacionPeriodo obj = new ProgramacionPeriodo();
                setearProgramacionPeriodo(obj,rs);
                return obj;
            }
        }
        finally {
            if(st!=null) st.close();
        }        
        return null;
    }
    
    public List<ProgramacionPeriodo> findByFilter(Connection con, ProgramacionPeriodo filtro) throws SQLException, ParseException {
        List<ProgramacionPeriodo> lista = new ArrayList<ProgramacionPeriodo>();
        Statement st = null;
        try {                        
            st = con.createStatement();
            String sql = "select * from Programacion_Periodo where Año='"+filtro.getAnho()+"'";
            ResultSet rs = st.executeQuery(sql);            
            while(rs.next()) {
                ProgramacionPeriodo obj = new ProgramacionPeriodo();
                setearProgramacionPeriodo(obj,rs);                
                lista.add(obj);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        return lista;
    }

    public void guardar_actualizar(Connection con, List<ProgramacionPeriodo> lista) throws Exception {
        Statement st = null;
        try {                        
            st = con.createStatement();            
            for(ProgramacionPeriodo pp: lista) {
                RegistroSql r = new RegistroSql("Programacion_Periodo");
                r.agregarClave("Año", pp.getAnho());
                r.agregarClave("Mes", pp.getMes());
                r.agregar("fecha_inicio", pp.getPeriodo1().getFechaInicio());  
                
                ResultSet rs = st.executeQuery(r.getSelectClaveSql());  
                SentenciaSql s;
                if(rs.next()) {
                    s = new SentenciaSql(TipoSentenciaSql.UPDATE,r);
                } else {
                    s = new SentenciaSql(TipoSentenciaSql.INSERT,r);
                }   
                //System.out.println("sql="+s.getSql());
                st.executeUpdate(s.getSql());
            }
            
        }
        finally {
            if(st!=null) st.close();
        }
    }
    
    
    public void crearProgramacionSiNoExisteParaAnhos(Connection con, List<Integer> anhos) throws SQLException {
        Statement st = null;
        try {                        
            st = con.createStatement();
            for(Integer anho: anhos) {
                for(MesEnum m : MesEnum.values()) {
                    String mes = m.getCodigoString();
                    ResultSet rs = st.executeQuery("select * from Programacion_Periodo where Año='"+anho+"' and Mes='"+mes+"'");
                    if(!rs.next()) {
                        String fecha = "01/"+mes+"/"+anho;
                        st.executeUpdate("insert into Programacion_Periodo(año,mes,fecha_inicio) values ('"+anho+"','"+mes+"','"+fecha+"')");
                    }
                }
            }
            
        }
        finally {
            if(st!=null) st.close();
        }
    }

    /*
    public ConglomeradoPersonalService getConglomeradoPersonalService() {
    return conglomeradoPersonalService;
    }
    public void setConglomeradoPersonalService(ConglomeradoPersonalService conglomeradoPersonalService) {
    this.conglomeradoPersonalService = conglomeradoPersonalService;
    }
     */
    public ConglomeradoService getConglomeradoService() {
        return conglomeradoService;
    }

    public void setConglomeradoService(ConglomeradoService conglomeradoService) {
        this.conglomeradoService = conglomeradoService;
    }

    
    
   
    
}
